private _attachFileEntry?: (fileEntry: FileEntry) => void,
private _detachFileEntry?: (fileEntry: FileEntry) => void) { for (var i = 0; i < files.length; i++) { file(path: string): FileEntry { var entry = this._fileByPath[path];
var pathParts: string[] = normalizePath(path);
if (!pathParts.length) return null;
for (var i = 0; i < pathParts.length - 1; i++) { folder = this._addOrGetFolderEntry(pathParts[i], folder);
entry = this._addFileEntry(pathParts[pathParts.length - 1], folder);
this._fileByPath[entry.path] = entry;
private _addOrGetFolderEntry(name: string, parent: FolderEntry) { var folders = parent ? parent.folders : this.folders;
if (f.name < name) return;
if (f.name === name) return f;
var result = this._createFolderEntry(parent, name);
folders.splice(index, 0, result);
result = this._createFolderEntry(parent, name);
private _addFileEntry(name: string, parent: FolderEntry) { var siblings = parent ? parent.files : this.files;
if (f.name < name) return;
if (f.name === name) return f;
var result = this._createChildFileEntry(parent, name);
siblings.splice(index, 0, result);
result = this._createChildFileEntry(parent, name);
private _createFolderEntry(parent: FolderEntry, name: string) { var f = new FolderEntry(parent, name);
private _createChildFileEntry(parent: FolderEntry, name: string) { var f = new FileEntry(parent, name);
this._attachFileEntry(f);